home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / pascal / bpl70n15.zip / INSTR.PAS < prev    next >
Pascal/Delphi Source File  |  1994-01-07  |  3KB  |  56 lines

  1. { Instr is similar to Pos, but allows to specify a start position at which the
  2.   search in the Target string for the Objct string is to start.
  3.  
  4.   Copyright (c) 1989-1994 Norbert Juffa
  5. }
  6.  
  7.  
  8.  
  9. FUNCTION  Instr  (Objct, Target: STRING; StartPos: BYTE): BYTE; ASSEMBLER;
  10. ASM
  11. {$IFOPT G+}
  12.            PUSH    BP            { save frame pointer }
  13. {$ENDIF}
  14.            CLD                   { auto increment for string instructions }
  15.            PUSH    DS            { save Turbo Pascal's data segment }
  16.            LES     DI, [Target]  { pointer to target string }
  17.            LDS     SI, [Objct]   { pointer to object string }
  18.            XOR     BX, BX        { initialize }
  19.            OR      BL, [StartPos]{  start position }
  20.            JZ      @NoChange     { don't change when zero }
  21.            DEC     BX            { dekrement start position }
  22. @NoChange: LODSW                 { AL = length Object, AH = 1. char in Object }
  23.            SUB     AL, 1         { length Object - 1 }
  24.            JB      @NotFound1    { exit, if length-1 < 0 }
  25.            MOV     CL, ES: [DI]  { length target String }
  26.            MOV     CH, CL        { length traget String }
  27.            SUB     CL, AL        { length target - length Object + 1 }
  28.            JBE     @NotFound1    { if <= 0, exit }
  29.            SUB     CL, BL        { remaining length Target }
  30.            JBE     @NotFound1    { if <= 0, exit }
  31.            INC     DI            { 1. char in Target }
  32.            ADD     DI, BX        { start position in Target }
  33.            XCHG    CH, BH        { BH = length target string, CH = 0 }
  34.            XCHG    AL, AH        { AL = 1. char Object, AH = length Object }
  35.            MOV     BP, SI        { save pointer }
  36. @Search1:  REPNZ   SCASB         { scan target for 1st char of Object }
  37.            JNZ     @NotFound2    { if not found, exit }
  38.            MOV     BL, CL        { save remaining length target }
  39.            MOV     CL, AH        { char still to compare in Object }
  40.            MOV     DX, DI        { get offset into Target }
  41.            REPZ    CMPSB         { compare CX chars of Target and Object }
  42.            MOV     SI, BP        { offset into Object }
  43.            MOV     DI, DX        { offset into Target }
  44.            MOV     CL, BL        { remaining length Target }
  45.            JNZ     @Search1      { continue search if no complete match }
  46.            SUB     BH, BL        { pos = length Target - remaining len target}
  47.            SUB     BH, AH        { pos = l. Target - rem. l. target - l. Object}
  48. @NotFound1:MOV     CH, BH        { pos }
  49. @NotFound2:MOV     AL, CH        { pos }
  50.            XOR     AH, AH        { clear MSB }
  51.            POP     DS            { restore TURBO Pascal's data segment }
  52. {$IFOPT G+}
  53.            POP     BP            { restore frame pointer }
  54. {$ENDIF}
  55. END; { Instr }
  56.